#ifndef TASK_H
#define TASK_H

#include "type.h"

#define MAX_THREADS 1024
#define STACK_SIZE 4096 // 每个线程的栈大小


// typedef int64_t off_t;  // 64位偏移量
typedef unsigned int ssize_t;
// typedef int size_t;

// 线程状态结构体
typedef struct thread{
    uint64_t rsp;       // 栈指针
    uint64_t rip;       // 指令指针
    uint64_t rflags;    // 标志寄存器
    uint64_t rbp;       // 基址指针
    uint64_t cr3;       // 页表基址寄存器
    uint64_t stack_base; // 栈基址
    uint64_t stack_size; // 栈大小
    int pid;            // 线程ID
    char* name;      // 线程名称
    void* arg;          // 线程参数
    struct thread* last;
    struct thread* next;
} thread;

// typedef struct
// {
// 	thread_t* last;
// 	thread_t now;
// 	thread_t* next;
// } thread;
// typedef union 
// {
//     uint64_t stack[256],
//     struct reg{
//         uint64_t why_you_use_this[246], //填充
//         uint64_t r15,
//         uint64_t r14,
//         uint64_t r13,
//         uint64_t r12,
//         uint64_t rbx,
//         uint64_t rbp,
//         uint64_t rsi,
//         uint64_t rcx,
//         uint64_t rax,
//         uint64_t ret_addr
//     } regs;
// } task_stack;

// 线程管理函数
int do_fork(char* name, void* enter, void* arg, thread* th, uint64_t stack_base);
int kthread(char* name, void* enter, void* arg); // 创建线程
void thread_exit();                             // 线程退出
void schedule();                                 // 调度器
void init_threads();                             // 初始化线程管理


#endif